package com.spring.dao.impl;

import com.spring.dao.UserDao;
import com.spring.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * @Author 咕唧
 * @Date 2022/5/19 11:27
 * @Version 1.0
 */

//@Component//使用spring中的注解创建对象
@Repository //为了方便区分，Component注解的别名,Repository是说当前的类主要是进行数据操作的

@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)//设置对象的创建是单例还是多例
//ConfigurableBeanFactory.SCOPE_PROTOTYPE 创建多例对象
//ConfigurableBeanFactory.SCOPE_SINGLETON 创建单例对象
public class UserDaoImpl implements UserDao {
    @Value("张三") //给基本数据类型或者是字符串进行赋值的
//    @Autowired //自动注入，推荐在set方法上
    private UserService userService;
    @Autowired //会按照参数的类型来进行注入, 建议写在set方法
//    @Qualifier("UserServiceImpl")//这个注解的作用是因为Autowired是默认按照类型注入的,
    // 如果这个类型的对象有多个,那么可以通过当前注解来指定名字(id)
//    @Resource(name="UserServiceImpl") //这个注解可以代替上面两个
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    private String name;

    public UserDaoImpl() {
        System.out.println("UserDaoImpl的构造方法执行了");
    }

    @Override
    public void addUser() {
        System.out.println("UserDaoImpl的addUser方法执行了");
    }

    @PostConstruct //这个注解的作用是声明当前方法是一个init-method
    public void init() {
        System.err.println("UserDaoImpl中的方法init 执行了");
    }

    @PreDestroy //当前的注解作用是声明是一个destory-method
    public void destroy() {
        System.err.println("UserServiceImpl中的方法destroy执行了");
    }
}
